package com.fatmeraid.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fatmeraid.common.exception.FarmException;
import com.fatmeraid.common.login.LoginUser;
import com.fatmeraid.common.login.LoginUserHolder;
import com.fatmeraid.common.model.PageResult;
import com.fatmeraid.common.result.ResultCodeEnum;
import com.fatmeraid.dao.ProductTypeDao;
import com.fatmeraid.dao.UserDao;
import com.fatmeraid.domain.ProductType;
import com.fatmeraid.domain.User;
import com.fatmeraid.service.ProductTypeService;
import com.fatmeraid.vo.PaginationVo;
import com.fatmeraid.vo.productType.TypeAddVo;
import com.fatmeraid.vo.productType.TypeUpdateVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

@Service
public class ProductTypeServiceImpl implements ProductTypeService {

	@Autowired
	private ProductTypeDao productTypeDao;

	@Autowired
	private UserDao userDao;
	@Override
	public Boolean uploadProductType(TypeAddVo typeAddVo) {

		// 查看当前权限是否为管理员
		LoginUser loginUser = LoginUserHolder.getLoginUser();
		Long userId = loginUser.getUserId();
		if (userDao.selectById(userId).getRoleType()!=3){
			throw new FarmException(ResultCodeEnum.ADMIN_ACCESS_FORBIDDEN);
		}

		if (!StringUtils.hasText(typeAddVo.getTypeName())) {
			throw new FarmException(ResultCodeEnum.PARAM_ERROR.getCode(), "商品类型名称不能为空");
		}

		// 检查商品类型名称是否已存在
		LambdaQueryWrapper<ProductType> queryWrapper = new LambdaQueryWrapper<>();
		queryWrapper.eq(ProductType::getTypeName, typeAddVo.getTypeName());
		ProductType existingType = productTypeDao.selectOne(queryWrapper);

		if (existingType != null) {
			throw new FarmException(ResultCodeEnum.ADMIN_USERNAME_ALREADY_EXISTS.getCode(), "商品类型名称已存在");
		}

		// 创建商品类型实体对象
		ProductType productType = new ProductType();
		// 设置商品类型名称和描述
		productType.setTypeName(typeAddVo.getTypeName());
		productType.setDescription(typeAddVo.getDescription());
		// 插入数据库
		int insert = productTypeDao.insert(productType);

		return insert>0;
	}

	@Override
	public PageResult<ProductType> getProductTypeList(PaginationVo paginationVo) {
		// 参数校验
		 if (paginationVo == null) {
			 throw new FarmException(ResultCodeEnum.PARAM_ERROR);
		 }
		 if (paginationVo.getCurrent() < 1 || paginationVo.getSize() < 1) {
			 throw new FarmException(ResultCodeEnum.PARAM_ERROR.getCode(), "页码和每页数量不能小于1");
		 }
		 if (paginationVo.getCurrent()==null||paginationVo.getSize()==null){
			 throw new FarmException(ResultCodeEnum.PARAM_ERROR.getCode(), "页码和每页数量不能为空");
		 }


		LoginUser loginUser = LoginUserHolder.getLoginUser();
		Long userId = loginUser.getUserId();
		Integer roleType = userDao.selectById(userId).getRoleType();
		// 创建分页对象
		IPage<ProductType> page = new Page<>(paginationVo.getCurrent(), paginationVo.getSize());

		// 创建查询条件
		QueryWrapper<ProductType> queryWrapper = new QueryWrapper<>();
		if (paginationVo.getKeyword() != null && !paginationVo.getKeyword().isEmpty()) {
			queryWrapper.like("type_name", paginationVo.getKeyword());
		}
		if(roleType!=3){
			queryWrapper.eq("status", 1);
		}

		// 执行分页查询
		IPage<ProductType> userIPage = productTypeDao.selectPage(page, queryWrapper);
		return new PageResult<>(userIPage.getTotal(), userIPage.getRecords());
	}

	@Override
	public boolean updateProductType(TypeUpdateVo typeUpdateVo) {
		// 1. 权限校验：仅管理员可操作（修复潜在NPE：先判断user是否存在）
		LoginUser loginUser = LoginUserHolder.getLoginUser();
		Long userId = loginUser.getUserId();
		User user = userDao.selectById(userId);
		if (user.getRoleType() != 3) {
			throw new FarmException(ResultCodeEnum.ADMIN_ACCESS_FORBIDDEN);
		}

		// 2. 核心参数校验（解决空指针+覆盖完整场景）
		if (typeUpdateVo == null) {
			throw new FarmException(ResultCodeEnum.PARAM_ERROR);
		}
		// 2.1 校验主键typeId（更新必须传ID，否则无法定位要更新的记录）
		if (typeUpdateVo.getTypeId() == null) {
			throw new FarmException(ResultCodeEnum.PARAM_ERROR.getCode(), "商品类型ID不能为空");
		}
		// 2.2 校验status（先判断是否为null，再校验值范围，避免空指针）
		Integer status = typeUpdateVo.getStatus();
		if (status != null && !(status == 0 || status == 1)) { // 仅当status不为null时才校验值
			throw new FarmException(ResultCodeEnum.PARAM_ERROR.getCode(), "状态参数错误（仅支持0-禁用/1-启用）");
		}
		// 2.3 校验typeName（若传了名称，去空格避免纯空格；未传则不处理）
		String typeName = typeUpdateVo.getTypeName();
		if (StringUtils.hasText(typeName)) {
			typeName = typeName.trim(); // 去前后空格
			if (typeName.length() > 50) { // 限制长度（与数据库字段匹配）
				throw new FarmException(ResultCodeEnum.PARAM_ERROR.getCode(), "商品类型名称长度不能超过50个字符");
			}
			typeUpdateVo.setTypeName(typeName); // 回写去空格后的名称
		}

		// 3. 检查商品类型名称是否已存在（排除当前更新的记录，避免误判）
		if (StringUtils.hasText(typeName)) { // 仅当传了新名称时才校验重复
			LambdaQueryWrapper<ProductType> queryWrapper = new LambdaQueryWrapper<>();
			queryWrapper.eq(ProductType::getTypeName, typeName) // 匹配新名称
					.ne(ProductType::getTypeId, typeUpdateVo.getTypeId()); // 排除当前更新的记录（关键！）
			ProductType existingType = productTypeDao.selectOne(queryWrapper);
			if (existingType != null) {
				throw new FarmException(ResultCodeEnum.PARAM_ERROR.getCode(), "商品类型名称已存在");
			}
		}

		// 4. 构建更新条件（修复description更新逻辑）
		LambdaUpdateWrapper<ProductType> luw = new LambdaUpdateWrapper<>();
		luw.eq(ProductType::getTypeId, typeUpdateVo.getTypeId()); // 仅更新指定ID的记录

		// 4.1 更新typeName（传了新名称才更新）
		if (StringUtils.hasText(typeName)) {
			luw.set(ProductType::getTypeName, typeName);
		}
		// 4.2 更新description（传了新描述才更新，条件改为判断description自身）
		String description = typeUpdateVo.getDescription();
		if (StringUtils.hasText(description)) { // 用hasText避免纯空格
			luw.set(ProductType::getDescription, description);
		}
		// 4.3 更新status（传了status才更新，避免覆盖为null）
		if (status != null) {
			luw.set(ProductType::getStatus, status);
		}

		// 5. 执行更新并判断结果
		int updateRows = productTypeDao.update(null, luw); // 注意：update方法第一个参数传null（用wrapper指定更新内容）
		return updateRows > 0;
	}


}
